package JoReg

import (
	"fmt"
	"strconv"
)

var debugFlag = true

// printNfa 打印NFA状态节点信息
func (this *NfaManager) printNfa(nfaPtr *Nfa) {

	if !debugFlag {
		return
	}

	if nfaPtr == nil {
		//fmt.Println("无节点!")
		return
	}
	if nfaPtr.visited == true {
		return
	}
	nfaPtr.visited = true
	this.printNfaNode(nfaPtr)
	fmt.Println()
	this.printNfa(nfaPtr.upPtr)
	this.printNfa(nfaPtr.nextPtr)
}

func (this *NfaManager) printNfaNode(nfaPtr *Nfa) {
	if nfaPtr.nextPtr == nil && nfaPtr.upPtr == nil {
		fmt.Println("TERMINAL")
	} else {
		fmt.Printf("NFA state: " + strconv.Itoa(nfaPtr.stateIndex))
		fmt.Printf("--->")
		if nfaPtr.upPtr != nil {
			fmt.Printf(" up:" + strconv.Itoa(nfaPtr.upPtr.stateIndex) + " ,")
		}
		if nfaPtr.nextPtr != nil {
			fmt.Printf(" next:" + strconv.Itoa(nfaPtr.nextPtr.stateIndex))
		}
		fmt.Printf("  on:")
		if nfaPtr.edgeSet != nil && len(nfaPtr.edgeSet) > 0 {
			fmt.Printf("[")
			for edge, _ := range nfaPtr.edgeSet {
				fmt.Printf(string(edge) + ",")
			}
			fmt.Printf("]\n")
		} else {
			fmt.Printf("ε\n")
		}
	}
}

func (this *NfaManager) printMatch(tip string, stateNodeSet map[*Nfa]struct{}, enterFlag bool) {

	if !debugFlag {
		return
	}

	if stateNodeSet == nil || len(stateNodeSet) == 0 {
		fmt.Println(tip + "无状态节点")
	}
	fmt.Printf(tip + ":{")
	for stateNode, _ := range stateNodeSet {
		fmt.Printf(strconv.Itoa(stateNode.stateIndex) + ",")
	}
	fmt.Printf("}")
	if enterFlag {
		fmt.Println()
	}
}
